package com.atguigu.sql.dataframe

import com.atguigu.sql.dataframe.DsDemo.User
import com.atguigu.sql.util.MySparkSessionUtil
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row}

/**
 * description ：rdd, dataframe, dataset三者的转换
 * author      ：剧情再美终是戏 
 * mail        : 13286520398@163.com
 * date        ：Created in 2020/1/11 11:13
 * modified By ：
 * version:    : 1.0
 */
object ThreeDDTransale {

  /*
  *  TODO 1、rdd --> dataframe, datasete 两者的区别是转换后，df是弱类型，ds是强类型
  *     rdd.toDF --> DataFrame(Dataset[Row])
  *     rdd.toDs --> Dataset[User]
  * TODO 2、rdd --> dataframe, datasete --> rdd 两者的区别就是转换之后的类型问题，还是跟原来一样，df返回的是是弱类型，ds返回的是强类型
  *     df.rdd --> RDD[Row]
  *     ds.rdd --> RDD[User]
  * TODO 3、dataframe--> datasete || datasete -->  dataframe
  *     df.as[User] df转换为ds的话，是提升为强类型，所以需要指定类型
  *     ds.toDF()   ds转换为df,是放弃强类型，所以直接转换就好了
   */

  def main(args: Array[String]): Unit = {

    // 获取 sparkSession 对象
    val spark = MySparkSessionUtil.get(args)

    val rdd: RDD[String] = spark.sparkContext.textFile("c:/user.txt")

    // 转换RDD[User]
    val rdd2: RDD[User] = rdd.map {
      line =>
        val splits = line.split("\t")
        User(splits(0).toInt, splits(1))
    }

    // TODO　rdd --> dataframe, datasete
    println("---------rdd --> dataframe, datasete------------")
    import spark.implicits._
    val df: DataFrame = rdd2.toDF()
    val ds: Dataset[User] = rdd2.toDS()

    df.show(1000)
    ds.show(1000)

    // TODO　dataframe, datasete --> rdd
    println("----------dataframe, datasete --> rdd-------------")
    val dfToRdd: RDD[Row] = df.rdd
    val dsToRdd: RDD[User] = ds.rdd

    dfToRdd.foreach(println)
    dsToRdd.foreach(println)

    // TODO　dataframe--> datasete || datasete -->  dataframe
    println("---------dataframe--> datasete || datasete -->  dataframe-------------")
    val dsByDf: Dataset[User] = df.as[User]
    val dfByDs: DataFrame = ds.toDF()
    dsByDf.show()
    dfByDs.show()


    // 关闭 sparkSession 资源
    MySparkSessionUtil.close(spark)
  }

}
